package example.testBeanPostProcessor;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.PriorityOrdered;
import org.springframework.stereotype.Component;

@Component
public class MyBeanPostProcessor implements BeanPostProcessor, PriorityOrdered {
	//初始化之前会执行的方法，需要注意的是最后一定要返回bean，否则spring的容器中不会有这个bean
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		//这个后置处理器中的方法是对所有的bean都会生效，这里加上判断是循环到我们自己定义的bean的时候才执行
		//这里输出的位置是ComponentOne这个类的的构造方法之后，初始化方法之前,
		//其实看到这里可以大致知道aop的实现原理，这里可以拿到所有的bean，那么我们可以对配置了aop的类可以创建一个代理对象
		if (beanName.equals("componentOne")) {
			System.out.println("postProcessBeforeInitialization1");
		}
		return bean;
	}

	//初始化之后会执行的方法，需要注意的是最后一定要返回bean，否则spring的容器中不会有这个bean
	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		//这里输出的位置是ComponentOne这个类的的构造方法和初始化方法之后
		if (beanName.equals("componentOne")) {
			System.out.println("postProcessAfterInitialization1");
		}
		return bean;
	}

	@Override
	public int getOrder() {
		return 100;
	}
}
